package 剑指offer;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

/** 

* @author ：soulstones
* @version ：2019年9月30日 下午9:52:21 
* @Description：
* 
输入一个正整数数组，把数组里所有数字拼接起来排成一个数，打印能拼接出的所有数字中最小的一个。例如输入数组{3，32，321}，
则打印出这三个数字能排成的最小数字为321323。
*/
public class A32把数组排成最小的数 {

	/*
 * 解题思路：
 * 先将整型数组转换成String数组，然后将String数组排序，最后将排好序的字符串数组拼接出来。关键就是制定排序规则。
 * 排序规则如下：
 * 若ab > ba 则 a > b，
 * 若ab < ba 则 a < b，
 * 若ab = ba 则 a = b；
 * 解释说明：
 * 比如 "3" < "31"但是 "331" > "313"，所以要将二者拼接起来进行比较
	 */
		public static String PrintMinNumber(int [] numbers) {
		        if(numbers == null || numbers.length == 0) return "";
		        int len = numbers.length;
		        String[] str = new String[len];
		        StringBuilder sb = new StringBuilder();
		        for(int i = 0; i < len; i++){
		            str[i] = String.valueOf(numbers[i]);
		        }
		        Arrays.sort(str,new Comparator<String>(){
		            @Override
		            public int compare(String s1, String s2) {
		                String c1 = s1 + s2;
		                String c2 = s2 + s1;
		                return c1.compareTo(c2);
		            }
		        });
		        for(int i = 0; i < len; i++){
		            sb.append(str[i]);
		        }
		        return sb.toString();
		    }
		
	/*

在这里自定义一个比较大小的函数，比较两个字符串s1, s2大小的时候，
先将它们拼接起来，比较s1+s2,和s2+s1那个大，如果s1+s2大，
那说明s2应该放前面，所以按这个规则，s2就应该排在s1前面	
	 */
		

			 public static String PrintMinNumber11(int [] numbers) {
			        String str = "";
			        for (int i=0; i<numbers.length; i++){
			            for (int j=i+1; j<numbers.length; j++){
			                int a = Integer.valueOf(numbers[i]+""+numbers[j]);
			                int b = Integer.valueOf(numbers[j]+""+numbers[i]);
			                if (a > b){
			                    int t = numbers[i];
			                    numbers[i] = numbers[j];
			                    numbers[j] = t;
			                }
			                 
			            }
			        }
			        for (int i = 0; i < numbers.length; i++) {
			            str += String.valueOf(numbers[i]);
			        }
			        return str;
			    }
		    
		    
		public static void main(String[] args) {
			 Scanner scanner = new Scanner(System.in);
				String s = scanner.nextLine();
				String[] ss = s.split(" ");
				int [] arr=new int [ss.length];
				for (int i = 0; i < arr.length; i++) {
					arr[i]=Integer.parseInt(ss[i]);
				}
				String str = PrintMinNumber(arr);
				System.out.println(str);
				String str11 = PrintMinNumber11(arr);
				System.out.println(str11);
		}
}
